<?php
/**
 * Created by PhpStorm.
 * User: air
 * Date: 18-8-25
 * Time: 下午8:01
 */


class SortTestHelper
{

    /**
     * 生成随机整数
     * @param $n
     * @param int $min
     * @param int $max
     * @return array
     */
    static function generateRandomIntArray($n,$min=0,$max=1){
        $arr=array();
        while ($n){
            array_push($arr,mt_rand($min,$max));
            $n--;
        }
        return $arr;
    }


    /**
     * 创建一个几乎排序好的数组
     * @param $n
     * @param $swapTimes
     * @return array
     */
    static function generateNearlyOrderedIntArray($n,$swapTimes){
        $arr=array();
        for ($i=0;$i<$n;$i++){
            array_push($arr,$i);
        }

        for ($i=0;$i<$swapTimes;$i++){
           self::swap($arr[mt_rand(0,$n-1)],$arr[mt_rand(0,$n-1)]);
        }
        return $arr;
    }


    /**
     * 测试排序算法
     * @param $sortName
     * @param $arr
     */
    static public function testSort(callable $sortName,$arr){
        $startTime=microtime(true);
        $sortArr=$sortName($arr);
        $endTime=microtime(true);
        if (!self::isSort($sortArr)){
            exit($sortName." 排序算法错误,没有成功排序");
        }
        echo $sortName.' : '.($endTime-$startTime)."s\n" ;
    }



    private function swap(&$a,&$b){
        $temp=$a;
        $a=$b;
        $b=$temp;
    }

    /**
     * 验证是否已经排序好
     * @param $arr
     * @return bool
     */
    private function isSort($arr){
        for ($i=0;$i<sizeof($arr)-1;$i++){
            if ($arr[$i]>$arr[$i+1]){
                return false;
            }
        }
        return true;
    }

}